#地理坐标点，包括地理坐标的创建，矩阵内所搜坐标，附近的人等
#地理坐标点不能被动态映射（dynamic mapping）自动检测，而是需要显式声明对应字段类型为 geo_point
    PUT /attractions
    {
      "mappings": {
        "restaurant": {
          "properties": {
            "name": {
              "type": "string"
            },
            "location": {
              "type": "geo_point"
            }
          }
        }
      }
    }

#经纬度坐标格式
    PUT /attractions/restaurant/1
    {
      "name":     "Chipotle Mexican Grill",
      "location": "40.715, -74.011"
    }

    PUT /attractions/restaurant/2
    {
      "name":     "Pala Pizza",
      "location": {
        "lat":     40.722,
        "lon":    -73.989
      }
    }

    PUT /attractions/restaurant/3
    {
      "name":     "Mini Munchies Pizza",
      "location": [ -73.983, 40.719 ]
    }
    #地理坐标点用字符串形式表示时是纬度在前，经度在后
    #而数组形式表示时刚好相反，是经度在前，纬度在后

#地理坐标盒模型过滤器，两个对角确定一个矩形区域
    GET /attractions/restaurant/_search
    {
      "query": {
        "filtered": {
          "filter": {
            "geo_bounding_box": {
              "location": {
                "top_left": {
                  "lat":  40.8,
                  "lon": -74.0
                },
                "bottom_right": {
                  "lat":  40.7,
                  "lon": -73.0
                }
              }
            }
          }
        }
      }
    }

#优化盒模型，把 geo_point 字段用 纬度（lat）和经度（lon）方式表示并分别索引
    PUT /attractions
    {
      "mappings": {
        "restaurant": {
          "properties": {
            "name": {
              "type": "string"
            },
            "location": {
              "type":    "geo_point",
              "lat_lon": true <1>
            }
          }
        }
      }
    }

# 使用已索引的 lat和lon, 设置 type 参数为 indexed (默认为 memory) 来明确告诉 Elasticsearch 对这个过滤器使用倒排索引
    GET /attractions/restaurant/_search
    {
      "query": {
        "filtered": {
          "filter": {
            "geo_bounding_box": {
              "type":    "indexed", <1>
              "location": {
                "top_left": {
                  "lat":  40.8,
                  "lon": -74.0
                },
                "bottom_right": {
                  "lat":  40.7,
                  "lon":  -73.0
                }
              }
            }
          }
        }
      }
    }

#地理距离过滤器,定位置为圆心画一个圆，来找出那些位置落在其中的文档
    GET /attractions/restaurant/_search
    {
      "query": {
        "filtered": {
          "filter": {
            "geo_distance": {
              "distance": "1km", <1>
              "location": { <2>
                "lat":  40.715,
                "lon": -73.988
              }
            }
          }
        }
      }
    }

#更快的地理距离计算
    GET /attractions/restaurant/_search
    {
      "query": {
        "filtered": {
          "filter": {
            "geo_distance": {
              "distance":      "1km",
              "distance_type": "plane",
              "location": {
                "lat":  40.715,
                "lon": -73.988
              }
            }
          }
        }
      }
    }
    #参数类型
    arc：最慢但是最精确是弧形（arc）计算方式
    plane：平面（plane）计算方式，((("plane distance calculation")))把地球当成是平坦的
    sloppy_arc：距离精度达99.9%。这也是默认的计算方式

#地理距离区间过滤器，指定最大和最小直径，计算区间内的点，匹配那些距离中心点超过1公里而小于2公里的位置
    GET /attractions/restaurant/_search
    {
      "query": {
        "filtered": {
          "filter": {
            "geo_distance_range": {
              "gte":    "1km", <1>
              "lt":     "2km", <1>
              "location": {
                "lat":  40.715,
                "lon": -73.988
              }
            }
          }
        }
      }
    }

#缓存地理位置过滤器
    GET /attractions/restaurant/_search
    {
      "query": {
        "filtered": {
          "filter": {
            "bool": {
              "must": [
                {
                  "geo_bounding_box": {
                    "type": "indexed",
                    "_cache": true, #缓存的地理盒模型过滤器把结果集缩小到了纽约市
                    "location": {
                      "top_left": {
                        "lat":  40,8,
                        "lon": -74.1
                      },
                      "bottom_right": {
                        "lat":  40.4,
                        "lon": -73.7
                      }
                    }
                  }
                },
                {
                  "geo_distance": { #代价更高的地理距离过滤器（geo_distance）让结果集缩小到1km内的用户
                    "distance": "1km",
                    "location": {
                      "lat":  40.715,
                      "lon": -73.988
                    }
                  }
                }
              ]
            }
          }
        }
      }
    }

#减少内存占用，精度降低到1毫米（1mm）级别，也可以减少1/3的内存使用
 更实际的，将精度设置到3米（3m）内存占用可以减少62%，而设置到1公里（1km）则节省75%之多
    POST /attractions/_mapping/restaurant
    {
      "location": {
        "type": "geo_point",
        "fielddata": {
          "format":    "compressed",
          "precision": "1km" <1>
        }
      }
    }


#将地理坐标点映射为文档值的方式只能是在这个字段第一次被创建时
#文档值会有一些小的性能代价，考虑到它对内存的节省，这种方式通常是还值得的
    PUT /attractions
    {
      "mappings": {
        "restaurant": {
          "properties": {
            "name": {
              "type": "string"
            },
            "location": {
              "type":       "geo_point",
              "doc_values": true
            }
          }
        }
      }
    }

#按距离排序
    GET /attractions/restaurant/_search
    {
      "query": {
        "filtered": {
          "filter": {
            "geo_bounding_box": {
              "type":       "indexed",
              "location": {
                "top_left": {
                  "lat":  40,8,
                  "lon": -74.0
                },
                "bottom_right": {
                  "lat":  40.4,
                  "lon": -73.0
                }
              }
            }
          }
        }
      },
      "sort": [
        {
          "_geo_distance": {
            "location": { <1>
              "lat":  40.715,
              "lon": -73.998
            },
            "order":         "asc",
            "unit":          "km", <2>
            "distance_type": "plane" <3>
          }
        }
      ]
    }
    #<1> 计算每个文档中 location 字段与指定的 lat/lon 点间的距离。
    #<2> 以 公里（km）为单位，将距离设置到每个返回结果的 sort 键中。
    #<3> 使用快速但精度略差的平面（plane）计算方式。

